/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.utils;

import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;

/**
 * Em alguns locais o Spring não consegue ou não pode realizar
 * injeção, como nos convertes JSF, validadores JSF e outros locais.
 * Nesses locais você utiliza os métodos estáticos desta classe para
 * recuperar o bean Spring desejado.
 *
 * @since 29/04/2012
 * @author Guilherme Braga
 */
public class SpringBean {

    /**
     * Passe a interface que representa o facade que deseja, por
     * exemplo: GrupoFacade facade =
     * SpringBeans.getBean(GrupoFacade.class); Não é necessário
     * realizar casting no retorno.<br> Se o bean não possuir uma
     * interface, utilize o nome de sua implementação,<b> mas
     * cuidado,</b> se houver necessidade do Spring realizar proxy no
     * bean, como nas transações, você é obrigado a criar uma
     * interface para o bean que deseja e passar a mesma como
     * parâmetro deste método.
     *
     * @param componente
     * @return um bean que implementa a interface passada.
     */
    public static <T> T getBean(Class<T> componente) {
        WebApplicationContext context =
                ContextLoaderListener.getCurrentWebApplicationContext();
        return context.getBean(componente);
    }

    /**
     * Caso exista mais de um bean que implementa uma mesma interface
     * passe o nome do bean, que é definido na anotação @Repository,
     * @Component ou @Service juntamente com a interface que
     * representa o tipo de retorno.
     *
     * @param <T>
     * @param nameBean
     * @param componente
     * @return um bean que implementa a interface passada.
     */
    public static <T> T getBean(String nameBean, Class<T> componente) {
        WebApplicationContext context =
                ContextLoaderListener.getCurrentWebApplicationContext();
        return context.getBean(nameBean, componente);
    }
}
